<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // call apply bind 修改this的指向, 函数原型上方法  函数才能使用
        // 函数.call(新的this,参数1,参数2...)  函数执行
        // 函数.apply(新的this,[参数1,参数2...])  函数执行 第二个参数，是数组或类数组
        // 函数.bind(新的this,参数1,参数2...)()  默认函数不会执行,后面添加()执行函数

        //call apply bind 如果不传参数 非严格window 严格undefined
        //call apply bind 如果传参数null/undefined  非严格window 严格null/undefined

        //"use strict";
        // function show(n,m){
        //     console.log(this,n,m);
        // }

        // show.call("aaa",10,20);//show函数执行，this--》aaa 参数10,20
        // show.apply("aaa",[10,20]);//show函数执行，this--》aaa 参数10,20
        //show.bind("aaa",10,20)();//默认函数不会执行,后面添加()执行函数 this--》aaa 参数10,20
        // show.call(null);
        // show.call(undefined);

        //console.log(Math.max(10,2,3));

        // var arr=[10,30,4];
        // console.log(Math.max(...arr));

        // var arr=[10,30,4];
        // console.log(Math.max.apply(null,arr));


        // Math.prototype.max=function max(){
        //     //1.this--》Math  2.参数 10,2,3
        //     //....

        //     //1.this--》window  2.参数  12,13,24

        //     //底层：一定用到this  但是用到了参数
        // }

        // Math.max(10,2,3)
        
        // Math.max.apply(null,[12,13,24])


            // const fn1 = function fn1() {
			//     console.log(1);
			// };
			// const fn2 = function fn2() {
			//     console.log(2);
			// };

            // fn1.call(fn2);// fn1函数执行  新this--fn2   1
            // fn1.call.call.call(fn2);//2
            // //两个及两个以上call--》"call方法"
            // //"call方法".call(fn2)===>fn2.call()==>fn2函数执行，this-->window

            // Function.prototype.call(fn2);//Function.prototype 匿名空函数
            // //匿名空函数执行, this--fn2   什么也没有

            // Function.prototype.call.call.call(fn2);//2
            // //"call方法".call(fn2)===>fn2.call()



            const fn1 = function fn1(n,m) {
			    console.log(1,n,m);
			};
			const fn2 = function fn2(n,m) {
			    console.log(2,this,n,m);
			};

            fn1.call.call.call.call.call(fn2,100,200);
            // "call方法".call(fn2,100,200)
            // fn2.call(100,200)
       
        
    </script>
</body>
</html>